Este análisis tiene como objetivo calcular probabilidades condicionales en el dataset de Airbnb, respondiendo preguntas como:
¿Cuál es la probabilidad de que un alojamiento tenga un precio accesible (<$100 USD) en ciertos barrios?
¿Cómo influye el tipo de habitación en la disponibilidad del alojamiento?
¿Qué tan probable es que un alojamiento tenga más de 3 baños si su precio es alto?
Estos cálculos son clave para entender patrones de precios y disponibilidad en distintos barrios de la ciudad.
install.packages("here",dependencies = TRUE)
library(here) # Manejo de rutas dinámicas
source(here("reportes/Proy_Airbnb/00_CONFIGURACION.r"))
# 📌 Cargar librerías necesarias
library(janitor) # Limpieza de nombres de columnas
library(summarytools) # Resumen estadístico detallado
library(ggplot2) # Gráficos
library(dplyr) # Manipulación de datos
library(plotly) # Gráficos Interactivos
# 📌 Configuración de gráficos globales
theme_set(theme_minimal())
# 📌 Cargar scripts de preprocesamiento
source(here("scripts/utils.r"))
source(here("scripts/1_preprocesamiento_esp_dataset.r"))
source(here("scripts/3_analisis_probabilidad.r"))
# 📌 Cargar dataset limpio
airbnb_data <- preprocesar_datos(here("datasets/listings_filtered.csv"), "Airbnb")
## 📥 Cargando datos del proyecto: Airbnb
## 🧹 Realizando limpieza de datos...
## 📊 Aplicando preprocesamiento específico para Airbnb...
## ✅ Preprocesamiento completado para: Airbnb
En esta sección analizamos la relación entre tipo de alojamiento, precios y disponibilidad, aplicando cálculos de probabilidad condicional.
📌 Probabilidad de que un alojamiento tenga un precio accesible (<1000) en barrios seleccionados
barrios_seleccionados <- c("Cuauhtémoc","Álvaro Obregón","Azcapotzalco")
# Calcular probabilidades
resultados_precio_barrio <- calcular_probabilidades(
data = airbnb_data %>% filter(neighbourhood_cleansed %in% barrios_seleccionados),
condicionante = "neighbourhood_cleansed",
objetivo = "price",
bins = 5 # Dividir el precio en intervalos
)
# Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_precio_barrio$tabla_contingencia)
## # A tibble: 5 × 3
## neighbourhood_cleansed price n
## <fct> <fct> <int>
## 1 Álvaro Obregón [-82.1,4.05e+04] 390
## 2 Azcapotzalco [-82.1,4.05e+04] 123
## 3 Cuauhtémoc [-82.1,4.05e+04] 5455
## 4 Cuauhtémoc (4.05e+04,8.1e+04] 1
## 5 Cuauhtémoc (1.62e+05,2.02e+05] 3
cat("\nProbabilidades condicionales:\n")
##
## Probabilidades condicionales:
print(resultados_precio_barrio$probabilidades_condicionales)
## # A tibble: 5 × 4
## neighbourhood_cleansed price n prob_condicional
## <fct> <fct> <int> <dbl>
## 1 Álvaro Obregón [-82.1,4.05e+04] 390 1
## 2 Azcapotzalco [-82.1,4.05e+04] 123 1
## 3 Cuauhtémoc [-82.1,4.05e+04] 5455 0.999
## 4 Cuauhtémoc (4.05e+04,8.1e+04] 1 0.000183
## 5 Cuauhtémoc (1.62e+05,2.02e+05] 3 0.000550
cat("\nProbabilidades marginales de precio:\n")
##
## Probabilidades marginales de precio:
print(resultados_precio_barrio$probabilidades_marginales)
## # A tibble: 3 × 3
## price n prob_marginal
## <fct> <int> <dbl>
## 1 [-82.1,4.05e+04] 5968 0.999
## 2 (4.05e+04,8.1e+04] 1 0.000167
## 3 (1.62e+05,2.02e+05] 3 0.000502
# 📌 Definir los bins para cada variable
bins_price <- seq(0, max(airbnb_data$price, na.rm = TRUE), by = 100) # Intervalos de 100 USD
bins_bathrooms <- seq(0, max(airbnb_data$bathrooms, na.rm = TRUE), by = 0.5) # Intervalos de 0.5 baños
# 📌 Transformar los datos antes de calcular probabilidades
airbnb_data_binned <- airbnb_data %>%
filter(price > 0, price < 1000,neighbourhood_cleansed %in% barrios_seleccionados) %>% # Filtrando valores extremos
mutate(
price = cut(price, breaks = bins_price, include.lowest = TRUE), # Convertir en categorías
bathrooms = cut(bathrooms, breaks = bins_bathrooms, include.lowest = TRUE) # Convertir en categorías
)
# 📌 Calcular la probabilidad condicional de baños dado el precio
resultados_bathrooms_vs_price <- calcular_probabilidades(
data = airbnb_data_binned, # Dataset con variables discretizadas
condicionante = "price", # Precio del alojamiento
objetivo = "bathrooms" # Número de baños
)
# 📌 Mostrar resultados corregidos
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_bathrooms_vs_price$tabla_contingencia)
## # A tibble: 53 × 3
## price bathrooms n
## <fct> <fct> <int>
## 1 (100,200] (0.5,1] 5
## 2 (100,200] (2,2.5] 4
## 3 (100,200] (4.5,5] 1
## 4 (200,300] [0,0.5] 1
## 5 (200,300] (0.5,1] 60
## 6 (200,300] (1,1.5] 5
## 7 (200,300] (1.5,2] 9
## 8 (200,300] (2,2.5] 2
## 9 (200,300] (2.5,3] 2
## 10 (200,300] (3,3.5] 1
## # ℹ 43 more rows
cat("\nProbabilidades condicionales:\n")
##
## Probabilidades condicionales:
print(resultados_bathrooms_vs_price$probabilidades_condicionales)
## # A tibble: 53 × 4
## price bathrooms n prob_condicional
## <fct> <fct> <int> <dbl>
## 1 (100,200] (0.5,1] 5 0.5
## 2 (100,200] (2,2.5] 4 0.4
## 3 (100,200] (4.5,5] 1 0.1
## 4 (200,300] [0,0.5] 1 0.0118
## 5 (200,300] (0.5,1] 60 0.706
## 6 (200,300] (1,1.5] 5 0.0588
## 7 (200,300] (1.5,2] 9 0.106
## 8 (200,300] (2,2.5] 2 0.0235
## 9 (200,300] (2.5,3] 2 0.0235
## 10 (200,300] (3,3.5] 1 0.0118
## # ℹ 43 more rows
cat("\nProbabilidades marginales de baños:\n")
##
## Probabilidades marginales de baños:
print(resultados_bathrooms_vs_price$probabilidades_marginales)
## # A tibble: 12 × 3
## bathrooms n prob_marginal
## <fct> <int> <dbl>
## 1 [0,0.5] 11 0.00607
## 2 (0.5,1] 1478 0.816
## 3 (1,1.5] 141 0.0779
## 4 (1.5,2] 109 0.0602
## 5 (2,2.5] 36 0.0199
## 6 (2.5,3] 17 0.00939
## 7 (3,3.5] 3 0.00166
## 8 (3.5,4] 11 0.00607
## 9 (4.5,5] 1 0.000552
## 10 (5.5,6] 1 0.000552
## 11 (7.5,8] 2 0.00110
## 12 (12.5,13] 1 0.000552
p_room_type_barrio <- visualizar_probabilidad_condicional(
data = airbnb_data %>% filter(neighbourhood_cleansed %in% barrios_seleccionados),
condicionante = "neighbourhood_cleansed",
objetivo = "room_type",
titulo = "Probabilidad de Tipo de Habitación por Barrio en Airbnb",
xlab = "Barrio",
guardar = TRUE,
ruta_guardado = here("reportes/Proy_Airbnb/resultados_generados/probabilidad_condicional_room_type_barrio.png")
)
p_room_type_barrio
p_precio_barrio <- visualizar_probabilidad_condicional(
data = airbnb_data %>% filter(neighbourhood_cleansed %in% barrios_seleccionados),
condicionante = "neighbourhood_cleansed",
objetivo = "price",
titulo = "Probabilidad de Precio por Barrio en Airbnb",
xlab = "Barrio",
guardar = TRUE,
ruta_guardado = here("reportes/Proy_Airbnb/resultados_generados/probabilidad_condicional_precio_barrio.png"),
bins = seq(0, max(airbnb_data$price, na.rm = TRUE), by = 100)
)
p_precio_barrio
p_bathrooms_price <- visualizar_probabilidad_condicional(
data = airbnb_data_binned,
condicionante = "price",
objetivo = "bathrooms",
titulo = "Probabilidad de Número de Baños dado el Precio en Airbnb",
xlab = "Precio (USD)",
guardar = TRUE,
ruta_guardado = here("reportes/Proy_Airbnb/resultados_generados/probabilidad_condicional_bathrooms_vs_price.png"),
bins = bins_price
)
# Ajustar etiquetas del eje X en plotly
p_bathrooms_price <- p_bathrooms_price %>% layout(xaxis = list(tickangle = 90))
# Mostrar el gráfico interactivo
p_bathrooms_price
Hemos aplicado cálculos de probabilidad condicional para explorar la relación entre precios, número de baños, barrios y tipo de habitación en Airbnb. Estas visualizaciones permiten una mejor interpretación de los datos para decisiones de inversión o análisis de tendencias.